Koa
Koa - микрофреймфорк, разработанный командой разработчиков фреймворка Express, и призванный использовать самые последние стандарты языка JavaScript.
Koa “предлагает” активно использовать синтаксис async/await
, который позволяет избавиться от ужасно нечитаемого callback hell
и является более хорошей альтернативой Promise. Углубляться в синтаксис здесь не будем, это не тема статьи.
Сам Koa, являясь микрофреймворком, из коробки содержит только middleware систему, в нем даже нет маршрутизации. Все это можно получить, подключив необходимую функциональность в middleware chain.
Требования
Koa требует версию Node не меньше 7.6.0
.
Использовать более старые версии можно, если подключить Babel, но тогда немного теряется посыл самого Koa (см. выше).
Версия MongoDB нас не интересует, поставим самую последнюю.
Подготовка среды
Про Node.js
Если Node не установлен, то вам необходимо сюда. Если же у вас еще и Linux или macOS, можно установить через менеджер пакетов - здесь сказано, как.
Чтобы проверить, что с Node все в порядке, можно набрать команду:
1 | $ node --version |
Она выведет текущую версию Node.
Также и про NPM:
1 | $ npm --version |
Установка зависимостей
Создайте директорию проекта, где будет храниться весь код. Откройте терминал и перейдите в данную директорию.
Инициализируем среду пакета:
1 | $ npm init |
NPM задаст несколько вопросов. Отвечаем хотя бы на имя пакета и имя автора.
1 | $ npm init |
У нас должен был появиться файл package.json
.
Поставим koa
:
1 | $ npm i koa |
Также поставим что-то для роутинга запросов. Будем использовать koa-router
, как самый популярный и полнофункциональный вариант.
И заодно koa-logger
, чтобы видеть наши запросы к серверу в терминале.
1 | $ npm i koa-router koa-logger |
Для общения с базой можно использовать пакет koa-mongo
.
1 | $ npm i koa-mongo |
MongoDB
Про Mongo
MongoDB — документоориентированная система управления базами данных (СУБД) с открытым исходным кодом. MongoDB реализует новый подход к построению баз данных, где нет таблиц, схем, запросов SQL, внешних ключей и многих других вещей, которые присущи объектно-реляционным базам данных.
Установка
Скачать установщик MongoDB можно отсюда. Предоставляются Community и Enterprise версии.
После установки надо создать на жестком диске каталог, в котором будут находиться базы данных MongoDB. В ОС Windows по умолчанию MongoDB хранит базы данных по пути C:\data\db, поэтому, если вы используете Windows, вам надо создать соответствующий каталог. В ОС Linux и MacOS каталогом по умолчанию будет /data/db.
Если же возникла необходимость использовать какой-то другой путь к файлам, то его можно передать при запуске MongoDB во флаге –dbpath.
Запуск сервера MongoDB
После создания каталога для хранения БД можно запустить сервер MongoDB. Сервер представляет приложение mongod, которое находится в папке bin. Для этого запустим командную строку (в Windows) или консоль в Linux и там введем соответствующие команды. Для ОС Windows это будет выглядеть так (предполагается, что MongoDB уствновился в C:\mongodb
):1
2cd c:\mongodb\bin
mongod
Командная строка отобразит нам ряд служебной информации, например, что сервер запускается на localhost
на порту 27017.
Если у вас используется расположение баз данных, отличающееся от настроек по умолчанию, то при запуске можно задать каталог для баз данных следующим образом:1
C:\mongodb\bin\mongod.exe --dbpath d:\test\mongodb\data
В данном случае предполагается, что базы данных у нас будут находиться в каталоге d:\test\mongodb\data
.
И после удачного запуска сервера мы сможем производить операции с бд через оболочку mongo. Эта оболочка представляет файл mongo.exe, который располагается в выше рассмотренной папке установки. Запустим этот файл:1
2cd c:\mongodb\bin
mongo
Если все установилось верно, и сервер запустился, терминал будет ожидать ввода запросов для взаимодействия с БД.
По умолчанию, MongoDB не использует какие-либо способы авторизации для доступа к базе данных. Сами разработчики MongoDB объясняют это тем, что всю логику должно содержать в себе приложение, а база должна делать то, для чего она лучше всего и предназначена — хранение и управление данными. Поэтому в этой статье соединение с авторизацией рассмотрено не будет.
База данных будет автоматически создана при первом обращении к ней (на запись).
Выйти можно, набрав exit
.
Hello, World!
Создадим файл app.js
, и заполним его немного измененным стандартным примером Koa. Из кода все достаточно понятно.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const Koa = require('koa');
const Router = require('koa-router');
const Logger = require('koa-logger');
const app = new Koa();
const router = new Router();
// Отвечаем миру на GET запросы
router.get('/', async (ctx) => {
ctx.body = 'Hello, World!\n';
});
// Отвечаем на имя на GET запросы. :name здесь - это часть URL, и является аргументом
router.get('/:name', async (ctx) => {
ctx.body = `Hello, ${ctx.params.name}!\n`;
});
// Логгер
app.use(Logger());
// Добавим все роуты. Второй middleware отвечает на OPTIONS запросы.
app.use(router.routes()).use(router.allowedMethods());
// Слушаем порт, запускаем сервер
app.listen(3000, () => {
console.log('Server running on port 3000');
});
Теперь можно запустить сервер:1
$ node app.js
Если сервер успешно запустился, то можно зайти в браузер, и в адресной строке перейти по адресу http://localhost:3000/
. Мы должны увидеть приветствие. Также, если к адресу добавить имя, т.е. н-р http://localhost:3000/Elisey
, мы должны увидеть свое имя в ответе.
В терминале мы должны увидеть примерно такую картину:1
2
3
4
5
6node app.js
Server running on port 3000
<-- GET /
--> GET / 200 19ms 14b
<-- GET /Elisey
--> GET /Elisey 200 3ms 15b
Теперь свяжемся с базой.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 ;
//Для этого добавим соответствующий модуль
const Mongo = require('koa-mongo');
// Используем Mongo
app.use(Mongo());
//Для пустых GET-запросов
router.get('/', async (ctx) => {
//С помощью метода find ищем необходимый документ в коллекции first_collection
const result = await ctx.mongo.db('test').collection('first_collection').find({ text: "Hello, world!" }).toArray();
//Если его нет, добавляем с помощью метода insert
if (result.length === 0)
ctx.mongo.db('test').collection('first_collection').insert({ text: "Hello, world!" });
var helloWorld = await ctx.mongo.db('test').collection('first_collection').find({ text: "Hello, world!" }).toArray();
ctx.body = helloWorld[0].text;
});
// Также поступим и с "именными" GET-запросами
router.get('/:name', async (ctx) => {
const result = await ctx.mongo.db('test').collection('first_collection').find({ text: ctx.params.name }).toArray();
if (result.length === 0)
ctx.mongo.db('test').collection('first_collection').insert({ text: ctx.params.name });
var name = await ctx.mongo.db('test').collection('first_collection').find({ text: ctx.params.name }).toArray();
name = name[0].text;
ctx.body = `Hello, ${name}!\n`;
});
Можно перезапустить сервер и увидеть результат.
References and useful links
- Node deps
- MongoDB
- Начало работы с MongoDB
- Building A Server-Side Application With Async Functions and Koa 2
- Koa examples
- Koa wiki - набор ссылок на все то, чем можно обвесить Koa для расширения его функциональности.
- Awesome Node.js